package packageController;

import java.io.IOException;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map.Entry;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import packageBusiness.InscriptionManager;
import packageBusiness.PanierManager;
import packageException.*;
import packageModel.Commande;
import packageModel.Composition;
import packageModel.Utilisateur;

/**
 *
 * @author Lionel & Julien
 */
public class InscriptionSyllatheque extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            response.setContentType("text/html;charset=UTF-8");
            
            // ---------------------------
            // Variable passé en requête
            String pseudo = request.getParameter("pseudo");
            String password = request.getParameter("password");
            String passwordConf = request.getParameter("passwordConf");
            String email = request.getParameter("email");
            String nom = request.getParameter("nom");
            String prenom = request.getParameter("prenom");
            String adresse = request.getParameter("lieu");
            String phone = request.getParameter("telephone");
            String url = request.getParameter("url");
            Boolean prof = Boolean.parseBoolean(request.getParameter("prof"));
            
            // ---------------------------
            // Création du futur utilisateur
            Utilisateur usr = null;
            InscriptionManager inscription = new InscriptionManager();
            
            // Récupération de la HashMap de l'invité !
            HttpSession session = request.getSession();
            HashMap <String, Composition> hashPanierInvite = (HashMap)session.getAttribute("panierInvite");
            
            // Création de l'utilisateur
            usr = inscription.InscriptionSyllatheque(pseudo, password, passwordConf, email, nom, prenom, adresse, phone, url, prof);
            
            // ---------------------------
            // Création des variables pour la vue
            request.setAttribute("inscription", "Félicitations ! Vous êtes bien inscrit sur Syllathèque. "
                    + "N'hésitez pas à commander vos syllabus dans les plus brefs délais.");
            
            RequestDispatcher rd = request.getRequestDispatcher("index.jsp");
            if(!(hashPanierInvite.isEmpty())) {
                // Le panier de l'invité n'est pas vide, il faut donc l'ajouter à son panier existant !
                PanierManager cde = new PanierManager();
                Commande newCde = cde.insertCommande(usr.getPseudo(), 
                                        new GregorianCalendar(), 
                                        null, 
                                        false
                                    );
                
                // On boucle sur le panier de l'invité
                for(Entry<String, Composition> entree : hashPanierInvite.entrySet()) { 
                    Composition compo = cde.insertComposition(
                                            newCde.getNumCde(), 
                                            entree.getValue().getSyllabus().getSyllabusId(), 
                                            entree.getValue().getQuantite(),
                                            entree.getValue().getPrix()
                                        );
                    
                    // Calcul de la promotion si l'utilisateur est un professeur
                    if(usr.isIsProf() == true) {
                        compo.setPrix(compo.getPrix() * 0.95);
                        compo = cde.modifyPrix(entree.getValue().getSyllabus().getSyllabusId(), pseudo, compo.getPrix());
                    }
                    
                    // On l'ajoute à notre futur panier !
                    usr.setHashPanier(entree.getKey(), compo);
                }
                rd = request.getRequestDispatcher("panier.jsp");
            }
            
            // ---------------------------
            // Création de la session du nouvel utilisateur
            //session.invalidate(); ???
            session.setAttribute("usr", usr);
            
            // ---------------------------
            // Redirection vers une page pour la vue
            rd.forward(request, response);
        } catch(InscriptionException e1) {
            // Erreur
            request.setAttribute("errorInscriptionPseudo", e1.toString());
            RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
            rd.forward(request, response);
        } catch(InvalideDonneesException e2) {
            // Erreur
            request.setAttribute("errorInvalideDonnees", e2.toString());
            RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
            rd.forward(request, response);
        } catch(CommandeException e3) {
            // Erreur
            request.setAttribute("error", e3.toString());
            RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
            rd.forward(request, response);
        } catch(CompositionException e4) {
            // Erreur
            request.setAttribute("error", e4.toString());
            RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
            rd.forward(request, response);
        } catch(SyllabusException e5) {
            // Erreur
            request.setAttribute("error", e5.toString());
            RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
            rd.forward(request, response);
        } catch(DataException e6) {
            // Erreur
            request.setAttribute("error", e6.toString());
            RequestDispatcher rd = request.getRequestDispatcher("erreur.jsp");
            rd.forward(request, response);
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
